package com.lzj.server.utils;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @description: 时间工具类，提供常用的日期时间操作
 */
public class TimeUtils {

    private static final String DATE_FORMAT = "yyyy-MM-dd";
    private static final String VALIDATION_DATE_FORMAT = "\\d{4}-\\d{2}-\\d{2}";

    // 格式化日期（LocalDate）
    public static String formatDate(LocalDate date) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);
        return date.format(formatter);
    }

    // 格式化日期时间（LocalDateTime）
    public static String formatDateTime(LocalDateTime dateTime) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return dateTime.format(formatter);
    }

    // 增加天数
    public static LocalDate addDays(LocalDate date, long daysToAdd) {
        return date.plusDays(daysToAdd);
    }

    // 减少天数
    public static LocalDate decDays(LocalDate date, long daysToSubtract) {
        return date.minusDays(daysToSubtract);
    }

    // 增加秒数
    public static LocalDateTime addSeconds(LocalDateTime dateTime, long seconds) {
        return dateTime.plusSeconds(seconds);
    }

    // 增加分钟数
    public static LocalDateTime addMinutes(LocalDateTime dateTime, long minutes) {
        return dateTime.plusMinutes(minutes);
    }

    // 增加小时数
    public static LocalDateTime addHours(LocalDateTime dateTime, long hours) {
        return dateTime.plusHours(hours);
    }

    // 增加周数
    public static LocalDate addWeeks(LocalDate date, long weeks) {
        return date.plusWeeks(weeks);
    }

    // 增加月数
    public static LocalDate addMonths(LocalDate date, long months) {
        return date.plusMonths(months);
    }

    // 增加年数
    public static LocalDate addYears(LocalDate date, long years) {
        return date.plusYears(years);
    }

    // 判断给定日期是否是当月的最后一天
    public static boolean isLastDayOfMonth(LocalDate date) {
        LocalDate firstDayOfNextMonth = date.plusMonths(1).withDayOfMonth(1);
        return date.plusDays(1).isEqual(firstDayOfNextMonth);
    }

    // 获取上个月的月份（yyyyMM格式）
    public static String getLastMonth() {
        LocalDate lastMonth = LocalDate.now().minusMonths(1);
        return lastMonth.format(DateTimeFormatter.ofPattern("yyyyMM"));
    }

    // 获取任意日期的上个月（yyyy-MM格式）
    public static String getLastMonth(String date) {
        if (date == null || !date.matches(VALIDATION_DATE_FORMAT)) {
            throw new IllegalArgumentException("日期格式不正确，应该为 yyyy-MM-dd");
        }

        LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_FORMAT));
        LocalDate lastMonth = localDate.minusMonths(1);
        return lastMonth.format(DateTimeFormatter.ofPattern("yyyy-MM"));
    }

    // 将 LocalDateTime 转换为 Date
    public static Date convertToDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    // 将 Date 转换为 LocalDateTime
    public static LocalDateTime convertToLocalDateTime(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    // 将 LocalDate 转换为 Date
    public static Date convertToDate(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    // 将 Date 转换为 LocalDate
    public static LocalDate convertToLocalDate(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }
}
